/**
 * @file luogu/3668/main.cpp
 * @brief
 * @see https://www.luogu.com.cn/record/77842375
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @copyright 2022
 * @date 2022/6/24 20:32:32
 **/

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
const int N = 1e5 + 10;
int n, a[N];
int s[N], t[N];  // s 为当前点是哪一个点的开头，t 表示当前点是那一个点的结尾
int x[N], y[N];  // 每种颜色的开始位置和结束位置
int top, ans;
int stk[N];
int main() {
  // High rating and good luck!
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    y[a[i]] = i;                    // 颜色 a[i] 最后出现的位置
    if (x[a[i]] == 0) x[a[i]] = i;  // 颜色 a[i] 最先出现的位置
  }
  for (int i = 1; i <= n; ++i) {
    if (x[i] != 0) s[x[i]] = i;  // s 是颜色 i 的开头
    if (y[i] != 0) t[y[i]] = i;  // t 是颜色 i 的结尾
  }
  for (int i = 1; i <= n; ++i) {
    if (a[i] == 0) {  // 一笔刷下来，颜色中间不能有空白
      if (top != 0) {
        ans = -1;
        break;
      }
    } else {
      if (s[i] != 0) {      // 当前点是一个点的开头
        stk[++top] = s[i];  // 多了一种颜色
        ans = max(ans, top);
      }
      if (stk[top] != a[i]) {  // 出现了颜色交叉的情况
        ans = -1;
        break;
      }
      if (t[i] != 0) {  // 当前点是一个点的结尾
        top--;          // 少了一种颜色
      }
    }
  }
  cout << ans << endl;
  return 0;
}
